'use strict';

// 1. 导入所需模块
// 导入路由处理的模块
const router = require('koa-router')();
// 导入fs模块
const fs = require('fs');
// 导入path模块
const path = require('path');

// 2. 编写函数，筛选文件夹下的js格式的文件
function searchControllers() {
    // 读取当前文件所在目录的绝对路径
    let files = fs.readdirSync(__dirname);
    // 过滤出以 .js 结尾的文件，并且不是 index.html 的文件
    let filterFiles = files.filter(item => {
        return item.endsWith('.js') && item !== 'index.html';
    });
    // 返回过滤完的文件
    return filterFiles;
}

// 3. 注册路由
function registerRouter(filterFiles) {
    filterFiles.forEach(item => {
        // 获取路由所在路径
        let fullPath = path.join(__dirname, item);
        // 导入路由对象
        let routerObj = require(fullPath);
        // 循环遍历路由对象
        for (let item in routerObj) {
            let valueArr = routerObj[item];
            // 获取路由请求地址所对应的请求类型
            let type = valueArr[0];
            // 根据路由请求类型注册对应的路由
            if (type === 'get') {
                if (valueArr.length === 2) {
                    let fn = valueArr[1];
                    // 参数第一项 item 为请求地址，第二项是请求地址所对应的处理函数
                    router.get(item, fn);
                } else {
                    let auth = valueArr[1];
                    let fn = valueArr[2];
                    router.get(item, auth, fn);
                }
            } else if (type === 'post') {
                if (valueArr.length === 2) {
                    let fn = valueArr[1];
                    router.post(item, fn);
                } else {
                    let auth = valueArr[1];
                    let fn = valueArr[2];
                    router.post(item, auth, fn);
                }
            } else if (type === 'put') {
                if (valueArr.length === 2) {
                    let fn = valueArr[1];
                    router.put(item, fn);
                } else {
                    let auth = valueArr[1];
                    let fn = valueArr[2];
                    router.put(item, auth, fn);
                }
            } else if (type === 'delete') {
                if (valueArr.length === 2) {
                    let fn = valueArr[1];
                    router.delete(item, fn);
                } else {
                    let auth = valueArr[1];
                    let fn = valueArr[2];
                    router.delete(item, auth, fn);
                }
            } else {
                console.log('请求类型错误！');
            }
        }
    });
}

// 4. 此文件作为中间件暴露出去，中间件必须为一个函数
module.exports = function () {
    // 调用 searchControllers() 函数
    let filterFiles = searchControllers();
    // 调用 registerRouter() 函数
    registerRouter(filterFiles);
    // 将路由返回出去
    return router.routes();
}